package service

import (
	"bufio"
	"bytes"
	"github.com/gin-gonic/gin"
	"go-admin/pkg/util"
	"os"
	"regexp"
	"strings"
)

// 获取文件信息
func (s *Service) GetFileInfo(c *gin.Context) (fileName, ContentType string, flag []byte, rd *bufio.Reader) {
	var reg_name = regexp.MustCompile(`filename="(.+)"`)
	var reg_content_type = regexp.MustCompile(`Content-Type: (.+)`)
	// 读取请求体
	rd = bufio.NewReader(c.Request.Body)
	// 读取第一行信息
	line, _ := rd.ReadBytes('\n')
	// 获取开始结束标识 ------WebKitFormBoundarygYrVeME0SuuBCmjm
	flag = line[0 : len(line)-2]
	// 读取下一行
	line, _ = rd.ReadBytes('\n')
	// 解析文件名 Content-Disposition: form-data; name="file"; filename="装修预算.xlsx"
	fileName = strings.TrimSpace(reg_name.FindStringSubmatch(string(line))[1])
	line, _ = rd.ReadBytes('\n')
	// 获取content-type
	ContentType = strings.TrimSpace(reg_content_type.FindStringSubmatch(string(line))[1])
	line, _ = rd.ReadBytes('\n')
	return
}

// 存储文件
func (s *Service) SaveFile(buf *bufio.Reader, flag []byte, src string) error {
	// 判断文件是否存在
	if exist := util.Exist(src); exist {
		// 删除文件
		if err := os.Remove(src); err != nil {
			return err
		}
	}
	// 创建文件
	f, err := os.OpenFile(src, os.O_WRONLY|os.O_APPEND|os.O_CREATE|os.O_EXCL, os.ModePerm)
	if err != nil {
		return err
	}
	// 关闭流
	defer f.Close()

	for {
		// 创建切片容器
		buf_b := make([]byte, 1024*8)
		// 将buf读取进buf_b
		n, _ := buf.Read(buf_b)
		// 判断
		if z := bytes.Index(buf_b, flag); z >= 0 {
			f.Write(buf_b[:z-2])
			// 将内存中的文件拷贝到磁盘稳定保存
			f.Sync()
			break
		}
		// 将容器的字节读取进文件
		f.Write(buf_b[:n])
		if n <= 0 {
			break
		}
	}
	return nil
}

